// 变量声明与类型推断
var name = 'Bob'; // 推断为 String 类型
Object objName = 'Alice'; // 显式声明为 Object 类型
String strName = 'Charlie'; // 显式声明为 String 类型

// 常量类（移到函数外部作为顶级类）
class Constants {
  static const String apiUrl = 'https://api.example.com';
}

// 空安全特性
void nullSafetyDemo() {
  String? nullableName = null; // 可空类型，默认值为 null
  String nonNullableName = 'Default'; // 非空类型，必须初始化

  // 非空断言（!）示例
  nullableName = 'Test';
  print('可空变量长度: ${nullableName!.length}'); // 非空断言后可访问属性
}

// 默认值演示
void defaultValuesDemo() {
  int? lineCount; // 可空类型默认值为 null
  String? message; // 可空字符串默认值为 null

  assert(lineCount == null); // 断言验证默认值
  // assert(message == null); // 生产环境中 assert 会被忽略
}

// 延迟初始化（late）演示
void lateInitializationDemo() {
  late String description; // 声明非空变量但延迟初始化

  // 在使用前赋值
  description = 'Late Initialization Example';
  print(description); // 正常输出

  // late 变量未初始化时访问会报错
  // late int errorVar;
  // print(errorVar); // 运行时错误：LateInitializationError
}

// final 和 const 演示
void finalAndConstDemo() {
  // final 变量：只能赋值一次
  final String userName = 'John';
  // userName = 'Alice'; // 错误：final 变量不可修改

  // const 常量：编译时常量
  const int maxCount = 100;
  const double piValue = 3.14159;

  // 常量集合
  const List<int> numbers = [1, 2, 3];
  const Map<String, int> scores = {'A': 90, 'B': 80};

  // 访问顶级类中的常量
  print('API URL: ${Constants.apiUrl}');
}

// 通配符变量（_）演示
void wildcardVariablesDemo() {
  // 局部通配符变量
  var _ = 10; // 声明但不使用的变量

  // for 循环中的通配符
  List<String> fruits = ['apple', 'banana', 'orange'];
  for (var _ in fruits) {
    // 循环中不需要使用变量值
  }

  // 捕获异常时的通配符
  try {
    throw Exception('Unknown error');
  } catch (_) {
    print('处理异常（通配符）');
  }

  // 函数参数中的通配符
  void printMessage(String _) {
    // 参数未使用，但声明为通配符避免警告
  }
}

// 主函数演示所有特性
void main() {
  print('=== 变量声明与类型推断 ===');
  print('name: $name');
  print('objName: $objName');
  print('strName: $strName');

  print('\n=== 空安全演示 ===');
  nullSafetyDemo();

  print('\n=== 默认值演示 ===');
  defaultValuesDemo();

  print('\n=== 延迟初始化演示 ===');
  lateInitializationDemo();

  print('\n=== final & const 演示 ===');
  finalAndConstDemo();

  print('\n=== 通配符变量演示 ===');
  wildcardVariablesDemo();
}
